package es.deusto.ingenieria.sd.tralala;
import javax.jdo.Extent;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;
import javax.jdo.Transaction;
import es.deusto.ingenieria.sd.tralala.Usuario;
import enumeraciones.Estado;
import enumeraciones.MetodoCalculo;
import enumeraciones.MetodoPago;


public class Main {

	public static void main(String[] args){
	System.out.println("Datanucleus + JDO example");
	

	java.util.Date fechaActual = new java.util.Date();
	MetodoPago mp= MetodoPago.PAYPAL;
	MetodoCalculo m=MetodoCalculo.CUOTA;
	Estado estado=Estado.NO_PAGADO;
	
	//Creamos los usuarios, indicando el metodo de pago y su metodo de calculo
	Usuario usu1= new Usuario("Alvaro", "alvaro@gmail.com",mp, m, "alvaro@gmail.com","vlfd" );
	Usuario usu2 = new Usuario("Benat", "benat@gmail.com", mp, m, "benat@gmail.com","vfdsv");
	
	//Creamos las canciones con su autor, nomnre, album, genero, duracion, letra y precio
	Cancion cancion1 = new Cancion("Danel", "cancion", "zumba", "Pop",1.587 ,"clrfvl", 0.99);
	
	Cancion cancion2= new Cancion("Deadmau", "adsd", "4x4012", "tecno",5.34, "Lararlalalal uno dos tresx100", 3.99  );
	//Generamos las reproducciones de los usuarios
	Reproduccion repro1 = new Reproduccion(cancion1, usu1);
	Reproduccion repro2 = new Reproduccion(cancion2, usu1);
	Reproduccion repro3 = new Reproduccion(cancion1, usu2);
	Reproduccion repro4 = new Reproduccion(cancion2,usu2);
	//anadimos al hasset de los usuarios sus reproducciones
	usu1.addReproduccion(repro1);
	usu1.addReproduccion(repro2);
	usu2.addReproduccion(repro3);
	usu2.addReproduccion(repro4);
	
	//generamos la factura pasando el id el estado, la fecha, el usuario y el haset de reproducciones de ese usuario
	Factura fac3=new Factura (0, estado, fechaActual, usu1,usu1.getReproducciones());
	Factura fac2=new Factura (0, estado, fechaActual,usu2, usu2.getReproducciones());
	
	//guardamos las facturas en el hasset de los usuarios
	usu1.addFactura(fac3);
	usu2.addFactura(fac2);
	
	// Load Persistence Manager Factory
	PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("TralalaProject");
	// Persistence Manager
	PersistenceManager pm = null;
	//Transaction to group DB opertaions
	Transaction tx = null;		
	
	try {
		System.out.println("- Store objects in the DB");			
		//Get the Persistence Manager
		pm = pmf.getPersistenceManager();
		//Obtain the current transaction
		tx = pm.currentTransaction();		
		//Start the transaction
		tx.begin();
		
		pm.makePersistent(usu1);
		pm.makePersistent(usu2);			
		
		//End the transaction
		tx.commit();			
		
	} catch (Exception ex) {
		System.err.println(" $ Error storing objects in the DB: " + ex.getMessage());
		ex.printStackTrace();
	} finally {
		if (tx != null && tx.isActive()) {
			tx.rollback();
		}
		
		if (pm != null && !pm.isClosed()) {
			pm.close();
		}
	}
	
	try {
		System.out.println("- Retreiving all the accounts using an 'Extent'...");			
		//Get the Persistence Manager
		pm = pmf.getPersistenceManager();
		//Obtain the current transaction
		tx = pm.currentTransaction();		
		//Start the transaction
		tx.begin();

		Extent<Usuario> extent = pm.getExtent(Usuario.class, true);
		
		for (Usuario account : extent) {
			System.out.println("  -> " + account);
		}
		
		//End the transaction
		tx.commit();
	} catch (Exception ex) {
		System.err.println(" $ Error retreiving accounts using an 'Extent': " + ex.getMessage());
	} finally {
		if (tx != null && tx.isActive()) {
			tx.rollback();
		}
		
		if (pm != null && !pm.isClosed()) {
			pm.close();
		}
	}

	try {
		
	} catch (Exception ex) {
		
	} finally {
		if (tx != null && tx.isActive()) {
			tx.rollback();
		}
		
		if (pm != null && !pm.isClosed()) {
			pm.close();
		}
	}

	try {
		

	} catch (Exception ex) {
		
	} finally {
		if (tx != null && tx.isActive()) {
			tx.rollback();
		}
		
		if (pm != null && !pm.isClosed()) {
			pm.close();
		}
	}

	try {
		System.out.println("- Cleaning the DB...");			
		//Get the Persistence Manager
		pm = pmf.getPersistenceManager();
		//Obtain the current transaction
		tx = pm.currentTransaction();
		//Start the transaction
		tx.begin();

		//Delete Usuario from DB
		Query query1 = pm.newQuery(Factura.class);
		System.out.println(" * '" + query1.deletePersistentAll() + "' facturas deleted from the DB.");			
		//Delete Reproduccion from DB
		Query query2 = pm.newQuery(Reproduccion.class);
		System.out.println(" * '" + query2.deletePersistentAll() + "' reproducciones deleted from the DB.");
		//Delete factura from DB
		Query query3 = pm.newQuery(Usuario.class);
		System.out.println(" * '" + query3.deletePersistentAll() + "' usuarios deleted from the DB.");
		//Delete Cancion from DB
		Query query4 = pm.newQuery(Cancion.class);
		System.out.println(" * '" + query4.deletePersistentAll() + "' canciones deleted from the DB.");
		
		//End the transaction
		tx.commit();
	} catch (Exception ex) {
		System.err.println(" $ Error vaciando la DB: " + ex.getMessage());
		ex.printStackTrace();
	} finally {
		if (tx != null && tx.isActive()) {
			tx.rollback();
		}
		
		if (pm != null && !pm.isClosed()) {
			pm.close();
		}
	}

	System.out.println("End of the Datanucleus + JDO example");
	System.out.println("====================================");
}

}
